package com.acol.estagio.workflow.struts.action;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.ActionError;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessage;
import org.apache.struts.action.ActionMessages;
import org.apache.struts.actions.DispatchAction;

import com.acol.estagio.workflow.services.util.EstagioServices;
import com.acol.estagio.workflow.struts.form.GerenciarCampeonatoForm;
import com.acol.estagio.workflow.vo.CampeonatoVO;
import com.acol.estagio.workflow.vo.ContaVO;
import com.acol.estagio.workflow.vo.JogosVO;
import com.acol.estagio.workflow.vo.TimesVO;

public class GerenciarCampeonatoAction extends DispatchAction{

	private CampeonatoVO campeonatoVO = new CampeonatoVO();
	private ContaVO contaVO = new ContaVO();

	public ActionForward unspecified(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
		GerenciarCampeonatoForm frm = (GerenciarCampeonatoForm) form;
		frm.inicializar(mapping, request);
		return listarCampeonato(mapping, form, request, response);
	}

	public ActionForward inserirCampeonato(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
		GerenciarCampeonatoForm frm = (GerenciarCampeonatoForm)form;
		JogosVO jogosVO = new JogosVO();
		TimesVO timesVO = new TimesVO();
		ActionErrors errors = frm.validateInserir(mapping, request);
		
		if(errors.isEmpty()){
			
			Integer seqCampeonato = EstagioServices.getCampeonatoBean().inserirCampeonato(frm.getCampeonatoVO());
			campeonatoVO.setSeqCampeonato(seqCampeonato);
			errors.add(ActionErrors.GLOBAL_ERROR, new ActionError("sucesso.campeonato.inserir", request.getContextPath() + "/images/icon_sucesso.gif", campeonatoVO.getNomeCampeonato()) );
			saveErrors(request, errors);
			return inserirJogos(mapping, form, request, response);

		}else{
			errors.add(ActionErrors.GLOBAL_ERROR, new ActionError("errors.campo.obrigatorio", request.getContextPath() + "/images/icon_erro.gif"));
			saveErrors(request, errors);
			if(campeonatoVO.getTipoCampeonato().equals("Personalizado")){
				return mapping.findForward("criarJogos");
			}

			return mapping.findForward("cadastrarCampeonato");
		}
	}

	public ActionForward inserirJogos(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
		GerenciarCampeonatoForm frm = (GerenciarCampeonatoForm)form;
		JogosVO jogosVO = new JogosVO();
		TimesVO timesVO = new TimesVO();
		ActionErrors errors = new ActionErrors();

		int rodadaControle = new Integer(frm.getCampeonatoVO().getJogosTotal()).intValue();
		Integer rodadaFinal = new Integer(frm.getCampeonatoVO().getRodadasTotal());
		Integer rodada = 1;
		Collection listaJogos = new ArrayList();
		
//		for(int i = 0; i < frm.getVetTimesCasa().length; i++){
//			if(frm.getVetTimesCasa()[i] == frm.getVetTimesCasa()[i-1]){
//				errors.add(ActionErrors.GLOBAL_ERROR, new ActionError("errors.campo.obrigatorio", request.getContextPath() + "/images/icon_erro.gif"));
//				saveErrors(request, errors);
//			}
//		}


		for(int i = 0 , iaux = rodada; i < frm.getVetTimesCasa().length; i++,iaux++){
			jogosVO.setSeqCampeonato(campeonatoVO.getSeqCampeonato());

			timesVO = EstagioServices.getCampeonatoBean().getTimeByNome(frm.getVetTimesCasa()[i]);
			jogosVO.setSeqTimeCasa(timesVO.getSeqTime());

			timesVO = EstagioServices.getCampeonatoBean().getTimeByNome(frm.getVetTimesVisit()[i]);
			jogosVO.setSeqTimeVisitante(timesVO.getSeqTime());

			String datas = frm.getVetDataJogo()[i] + " - " + frm.getVetHoraJogo()[i];
			jogosVO.setDataJogo(datas);
			jogosVO.setResultadoJogo(" x ");
			jogosVO.setRodadaJogo(rodada.toString());

			//EstagioServices.getCampeonatoBean().inserirJogos(jogosVO);
			
			//listaJogos.add(jogosVO);
			
			if(rodadaControle == iaux){
				iaux = 0;
				rodada++;
			}
		}	
		
		//JogosVO[] vetListaJogos = (JogosVO[]) listaJogos.toArray();
		
//		for(int i = 0; i < vetListaJogos.length; i++){
//			EstagioServices.getCampeonatoBean().inserirJogos(vetListaJogos[i]);
//		}

		return unspecified(mapping, form, request, response);
	}

	public ActionForward selecionarCampeonato(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
		GerenciarCampeonatoForm frm = (GerenciarCampeonatoForm)form;
		Integer seqCampeonato = frm.getSeqCampeonato();

		campeonatoVO = EstagioServices.getCampeonatoBean().getCampeonato(seqCampeonato);
		frm.getCampeonatoVO().setSeqCampeonato(campeonatoVO.getSeqCampeonato());
		frm.getCampeonatoVO().setNomeCampeonato(campeonatoVO.getNomeCampeonato());
		frm.getCampeonatoVO().setDuracao(campeonatoVO.getDuracao());
		frm.getCampeonatoVO().setRegra(campeonatoVO.getRegra());
		frm.getCampeonatoVO().setTipoCampeonato(campeonatoVO.getTipoCampeonato());

		if("paraExclusao".equals(frm.getAcao())){
			frm.setStatus("EXCLUIR");
			return mapping.findForward("manutencaoCampeonato");
		}else{
			return redirecionar(mapping, form, request, response);
		}
	}

	public ActionForward atualizarCampeonato(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
		GerenciarCampeonatoForm frm = (GerenciarCampeonatoForm)form;
		CampeonatoVO campeonatoVO = new CampeonatoVO();

		ActionErrors errors = frm.validate(mapping, request);

		if(errors.isEmpty()){

			campeonatoVO.setNomeCampeonato(frm.getCampeonatoVO().getNomeCampeonato());
			campeonatoVO.setDuracao(frm.getCampeonatoVO().getDuracao());
			campeonatoVO.setRegra(frm.getCampeonatoVO().getRegra());
			campeonatoVO.setTipoCampeonato(frm.getCampeonatoVO().getTipoCampeonato());
			EstagioServices.getCampeonatoBean().alterarCampeonato(campeonatoVO);

			frm.reset(mapping, request);
			errors.add(ActionErrors.GLOBAL_ERROR, new ActionError("sucesso.campeonato.alterar", request.getContextPath() + "/images/icon_sucesso.gif"));
			saveErrors(request, errors);

			return mapping.findForward("cadastrarCampeonato");

		}else{
			saveErrors(request, errors);
			return mapping.findForward("cadastrarCampeonato");
		}
	}

	public ActionForward excluirCampeonato(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
		GerenciarCampeonatoForm frm = (GerenciarCampeonatoForm)form;
		Integer seqCampeonato = frm.getSeqCampeonato();
		Collection listaJogos = EstagioServices.getCampeonatoBean().getJogosByCampeonato(campeonatoVO.getSeqCampeonato());
		ActionErrors errors = new ActionErrors();
		
		//EXCLUI TODOS OS JOGOS REFERENTES AO CAMPEIONATO.
		Iterator<JogosVO> itj = listaJogos.iterator();
		while(itj.hasNext()){
			JogosVO j = itj.next();
			EstagioServices.getCampeonatoBean().excluirJogo(j.getSeqJogo());
		}
		EstagioServices.getCampeonatoBean().excluirCampeonato(seqCampeonato);
		frm.setStatus("BUSCAR");
		
		frm.inicializar(mapping, request);
		
//		errors.add(ActionErrors.GLOBAL_ERROR, new ActionError("sucesso.campeonato.deletar", request.getContextPath() + "/images/icon_sucesso.gif"));
//		saveErrors(request, errors);
		
		return unspecified(mapping, form, request, response);
	}

	public ActionForward listarCampeonato(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
		GerenciarCampeonatoForm frm = (GerenciarCampeonatoForm)form;
		CampeonatoVO campeonatoVO = new CampeonatoVO();
		ActionErrors errors = new ActionErrors();
		Collection listaCampeonato = new ArrayList();
		try{
			ContaVO contaVO = (ContaVO) request.getSession().getAttribute("contaVO"); 
			Integer seqConta = contaVO.getSeqConta();

			if("".equals(frm.getCampeonatoVO().getNomeCampeonato()) || frm.getCampeonatoVO().getNomeCampeonato() == null){

				listaCampeonato = EstagioServices.getCampeonatoBean().getListaCampeonatosByCadastro(seqConta);
			}
			else{
				String nomeCampeonato = frm.getCampeonatoVO().getNomeCampeonato();
				listaCampeonato = EstagioServices.getCampeonatoBean().getCampeonatosByName(nomeCampeonato, seqConta);
				//tgf
			}

			frm.setStatus("BUSCAR");

			if(!(listaCampeonato.isEmpty())){
				frm.setListaCampeonato(listaCampeonato);
				errors.add(ActionErrors.GLOBAL_ERROR, new ActionError("sucesso.campeonato.inserir", request.getContextPath() + "/images/icon_sucesso.gif", campeonatoVO.getNomeCampeonato()) );
			}else{
				errors.add(ActionErrors.GLOBAL_MESSAGE, new ActionMessage("vazia.lista.campeonato"));
				saveErrors(request, errors);
			}
		}catch(Exception e){
			errors.add(ActionErrors.GLOBAL_MESSAGE, new ActionMessage("Erro ao tentar puchar a lista de times"));
			saveErrors(request, errors);
		}

		frm.setStatus("BUSCAR");

		return mapping.findForward("manutencaoCampeonato");
	}

	public ActionForward paginaCadastrarCampeonato(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
		GerenciarCampeonatoForm frm = (GerenciarCampeonatoForm)form;
		frm.reset(mapping, request);
		contaVO = (ContaVO) request.getSession().getAttribute("contaVO");
		frm.getCampeonatoVO().setSeqConta(contaVO.getSeqConta());
		return mapping.findForward("cadastrarCampeonato");
	}

	public ActionForward paginaGerarCampeonato(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
		GerenciarCampeonatoForm frm = (GerenciarCampeonatoForm)form;
		ActionErrors errors = frm.validate(mapping, request);

		if(errors.isEmpty()){
			Integer seqConta = contaVO.getSeqConta();
			campeonatoVO.setNomeCampeonato(frm.getCampeonatoVO().getNomeCampeonato());
			campeonatoVO.setTipoCampeonato(frm.getCampeonatoVO().getTipoCampeonato());
			campeonatoVO.setJogosTotal(frm.getCampeonatoVO().getJogosTotal());
			campeonatoVO.setRodadasTotal(frm.getCampeonatoVO().getRodadasTotal());
			campeonatoVO.setRegra(frm.getCampeonatoVO().getRegra());
			campeonatoVO.setSeqConta(seqConta);

			Collection listaTimes = EstagioServices.getCampeonatoBean().getListaTimesByCadastro(seqConta);
			if(!(listaTimes.isEmpty())){		
				frm.setListaTimes(listaTimes); 
				if(campeonatoVO.getTipoCampeonato().equals("Personalizado")){
					return paginaCriarJogos(mapping, form, request, response);
				}else if(campeonatoVO.getTipoCampeonato().equals("Pontos Corridos")){
					
					//enviar para a pagina de confirma Jogos
					return mapping.findForward("gerarCampeonato");
				
				}else{				
					return mapping.findForward("paginaEmConstrucao");
				}
			}else{
				errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionError("errors.times.vazio"));
				saveErrors(request, errors);
				return mapping.findForward("paginaEmConstrucao");
			}

		}else{
			saveErrors(request, errors);
			frm.inicializar(mapping, request);
			frm.reset(mapping, request);
			return mapping.findForward("cadastrarCampeonato");
		}
	}

	public ActionForward paginaFinalizarCampeonato(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
		GerenciarCampeonatoForm frm = (GerenciarCampeonatoForm)form;
		ActionErrors errors = frm.validate(mapping, request);


		Collection listaTime = new ArrayList();
		if(frm.getCboMultiBox().length%2 == 0){
			if(!(frm.getCboMultiBox().length < 6)){
				for(int i=0 ; i < frm.getCboMultiBox().length ; i++){
					TimesVO timesVO = new TimesVO();
					timesVO.setSeqTime(new Integer(frm.getCboMultiBox()[i]));
					listaTime.add(EstagioServices.getCampeonatoBean().getTime(timesVO.getSeqTime()));
				}
				frm.setListaTimesCampeonato(listaTime);
			}else{
				errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionError("errors.lista.times.par" , request.getContextPath() + "/images/icon_erro.gif"));
				return mapping.findForward("gerarCampeonato");
			}
		}else{
			errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionError("errors.lista.times.minimo" , request.getContextPath() + "/images/icon_erro.gif"));
			return mapping.findForward("gerarCampeonato");
		}
		//this.campeonatoVO.setListaTimesCampeonato(listaTimesCampeonato);

		return gerarResultado(mapping, form, request, response);
	}

	public ActionForward gerarResultado(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response)throws Exception {
		GerenciarCampeonatoForm frm = (GerenciarCampeonatoForm)form;
		Collection listaTimes = frm.getListaTimesCampeonato();

		int flagTeste = 1;
		int nPartidas = listaTimes.size()/2;
		int nRodadas = listaTimes.size() - 1;
		int rodadaAtual = 1;
		int ultimosTime = 0;
		int penultimoTime = 0;
		boolean percorrerMatriz = true;
		Integer[] seqTimes = new Integer[listaTimes.size()];
		Integer tabelaJogos[][] = new Integer[nRodadas][listaTimes.size()];

		//preenche o vetor com o seq de cada time
		for(int cont=0; cont < listaTimes.size(); cont++){
			seqTimes[cont] = ((TimesVO)((ArrayList) listaTimes).get(cont)).getSeqTime();
		}
		//preenchar a matriz com 0
		for(int a=0;a<nRodadas;a++){
			for(int b=0;b<listaTimes.size();b++){
				tabelaJogos[a][b]= 0;
			}	
		}
		for(rodadaAtual = 1; rodadaAtual <= nRodadas ; rodadaAtual++){
			int cont=0;
			//sorteia os times para as partidas
			int timeSorteado = 0;
			Integer timeJogador[] = new Integer[listaTimes.size()];
			boolean salvar = false;
			
			for(int j=0 ; j<timeJogador.length ; j++)timeJogador[j]= 0;
			
			for(int i = 0 ; i < listaTimes.size() ; i++){  
				
				timeSorteado = seqTimes[(int) (Math.random()*listaTimes.size())];   
				salvar = true ;  
				percorrerMatriz = true;
				
				for (int y=0 ; y<=i ; y++ ){  
					if (timeJogador[y] == timeSorteado){  
						salvar = false;  
						i--;
						percorrerMatriz = false;
						break;
					}
				}
//					if((rodadaAtual > 0) && (timeJogador[0].equals(0) || timeJogador[1].equals(0))){
//					if (timeSorteado == tabelaJogos[rodadaAtual-1][listaTimes.size()-1]  || timeSorteado == tabelaJogos[rodadaAtual-1][listaTimes.size()-2]){
//					salvar = false;  
//					i--;
//					percorrerMatriz = false;
//					break;
//					}
//					if (timeSorteado == tabelaJogos[rodadaAtual-1][listaTimes.size()-1] || timeSorteado == tabelaJogos[rodadaAtual-1][listaTimes.size()-2]){
//					salvar = false;  
//					i--;
//					percorrerMatriz = false;
//					break;
//					}
//					}
				if(percorrerMatriz && rodadaAtual>1 && i%2!=0){
					Integer seqTimeSorteado = new Integer(timeSorteado); 

					String jogo = timeJogador[i-1].toString().concat(seqTimeSorteado.toString());
					String jogoInverso = seqTimeSorteado.toString().concat(timeJogador[i-1].toString());
					int linha = 0;
					int coluna = 0;
					
					//percorrer matriz
					for(linha=0; linha < rodadaAtual ; linha++){
						for(coluna=0; coluna < listaTimes.size() ; coluna+=2){

							String testarJogo = tabelaJogos[linha][coluna].toString().concat(tabelaJogos[linha][coluna+1].toString()); 

							if(jogo.equals(testarJogo)&& salvar){
								salvar = false;
								i-=2;
								System.out.println("JA="+linha+" coluna="+coluna);
								flagTeste++;
								if(flagTeste > listaTimes.size()*100){
									flagTeste = 1;
									for(int p=0;p<listaTimes.size();p++)timeJogador[p]=0;
								}
							}							
//							if(jogoInverso.equals(testarJogo) && salvar){
//								salvar = false;  
//								i-=2;
//								System.out.println("JAI="+linha+" coluna="+coluna);
//								
//							}
						}
						if(!salvar){
							break;
						}
					}

				}
				if(salvar){
					try{
						System.out.println(i);
						timeJogador[i] = timeSorteado;
						tabelaJogos[rodadaAtual-1][cont] = new Integer(timeSorteado);
						System.out.println("rodadaAtual="+rodadaAtual+" cont="+cont);
						cont++;						
					}catch (Exception e) {
						System.out.println("erro: "+ e.getMessage() );
					}
				}
			}
		}
		Integer seqCampeonato = EstagioServices.getCampeonatoBean().inserirCampeonato(campeonatoVO);
		campeonatoVO.setSeqCampeonato(seqCampeonato);
		if(campeonatoVO.getTipoCampeonato().equalsIgnoreCase("Pontos Corridos")){
			int timeSorteado=0;
			int cont =0;
			rodadaAtual = 0;
			while(rodadaAtual < nRodadas){
				while(cont < nPartidas) {
					JogosVO jogosVO = new JogosVO();
					jogosVO.setRodadaJogo(new Integer(rodadaAtual+1).toString());
					jogosVO.setResultadoJogo("x");
					Integer seqTimeCasa = tabelaJogos[rodadaAtual][timeSorteado];
					jogosVO.setSeqTimeCasa(seqTimeCasa);
					Integer seqTimeVisitante = tabelaJogos[rodadaAtual][timeSorteado+1];
					jogosVO.setSeqTimeVisitante(seqTimeVisitante);
					EstagioServices.getCampeonatoBean().inserirJogos(jogosVO);
					timeSorteado= timeSorteado + 2;					
					cont++;
				}
				rodadaAtual++;
				timeSorteado = 0;
				cont = 0;
			}
		}
		if(campeonatoVO.getTipoCampeonato().equalsIgnoreCase("Pontos Corridos - Ida e Volta")){
			int timeSorteado=0;
			int cont =0;
			rodadaAtual = 0;
			while(rodadaAtual < nRodadas){
				while(cont < nPartidas) {
					JogosVO jogosVO = new JogosVO();
					jogosVO.setRodadaJogo(new Integer(rodadaAtual+1).toString());
					jogosVO.setResultadoJogo("x");
					Integer seqTimeCasa = tabelaJogos[rodadaAtual][timeSorteado];
					jogosVO.setSeqTimeCasa(seqTimeCasa);
					Integer seqTimeVisitante = tabelaJogos[rodadaAtual][timeSorteado+1];
					jogosVO.setSeqTimeVisitante(seqTimeVisitante);
					timeSorteado= timeSorteado + 2;					
					cont++;
					frm.getListaTimesCampeonato().add(jogosVO);
				}
				rodadaAtual++;
				timeSorteado = 0;
				cont = 0;
			}
			timeSorteado=0;
			cont =0;
			int nRodadasVolta = nRodadas + 1;
			rodadaAtual = 0;
			while(nRodadasVolta <= (nRodadas*2)){
				while(cont < nPartidas) {
					JogosVO jogosVO = new JogosVO();
					jogosVO.setRodadaJogo(new Integer(rodadaAtual+1).toString());
					jogosVO.setResultadoJogo("x");
					Integer seqTimeCasa = tabelaJogos[rodadaAtual][timeSorteado+1];
					jogosVO.setSeqTimeCasa(seqTimeCasa);
					Integer seqTimeVisitante = tabelaJogos[rodadaAtual][timeSorteado];
					jogosVO.setSeqTimeVisitante(seqTimeVisitante);
					timeSorteado= timeSorteado + 2;					
					cont++;
					frm.getListaTimesCampeonato().add(jogosVO);
				}
				nRodadasVolta++;
				rodadaAtual++;
				timeSorteado = 0;
				cont = 0;
			}
		}
		if(campeonatoVO.getTipoCampeonato().equalsIgnoreCase("Mata-mata")){
			int timeSorteado=0;
			int cont =0;
			rodadaAtual = 0;
			while(cont < nPartidas) {
				JogosVO jogosVO = new JogosVO();
				jogosVO.setRodadaJogo(new Integer(rodadaAtual+1).toString());
				jogosVO.setResultadoJogo("x");
				Integer seqTimeCasa = tabelaJogos[rodadaAtual][timeSorteado];
				jogosVO.setSeqTimeCasa(seqTimeCasa);
				Integer seqTimeVisitante = tabelaJogos[rodadaAtual][timeSorteado+1];
				jogosVO.setSeqTimeVisitante(seqTimeVisitante);
				timeSorteado= timeSorteado + 2;					
				cont++;
				rodadaAtual++;
			}
		}
		if(campeonatoVO.getTipoCampeonato().equalsIgnoreCase("Personalizado")){

		}
		return mapping.findForward("finalizarCampeonato");
	}

	public ActionForward paginaCriarJogos(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
		GerenciarCampeonatoForm frm = (GerenciarCampeonatoForm)form;
		Collection listaTimes = frm.getListaTimes();
		ActionErrors errors = frm.validate(mapping, request);
		
		if(errors.isEmpty()){
			frm.setVetTimesCasa(null);
			frm.setVetTimesVisit(null);
			frm.setVetDataJogo(null);
			frm.setVetHoraJogo(null);
			return mapping.findForward("criarJogos");
		
		}else{
			errors.add(ActionErrors.GLOBAL_ERROR, new ActionError("errors.lista.jogos.par", request.getContextPath() + "/images/icon_erro.gif" ));
			saveErrors(request, errors);
		}

		return mapping.findForward("cadastrarCampeonato");
	}
	
	public ActionForward redirecionar(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
		GerenciarCampeonatoForm frm = (GerenciarCampeonatoForm) form;
		Integer seqCampeonato = frm.getSeqCampeonato();
		response.sendRedirect(request.getContextPath()+"/gerenciarJogos.do?task=editarJogos&seqCampeonato="+seqCampeonato);
		return null;

	}
}